const request = require('base')
const synctool = require('synctool')
const verify = require('./verify')
const authority = require('./authority')
const {basedata, getResult, getError, common} = request
/**
 * 用户登录
 * 1，用户id
 * 2，账号+密码
 * 3，手机号码+验证码。可以注册
 * 4，授权登录。保留参数。可能需要需要绑定的用户id，以及第三方授权的openid
 * 
 * 登录结果，返回或者注册返回用户信息，Ca-Token
 */
module.exports = (data, necessary) => {
	return new Promise((resolve, reject) => {
		const {Target = '', Prefix = '', Partya = '', Test = true, Apply = '', Device = '', Membership = 0} = request.common.necessary.Target ? request.common.necessary : necessary
		const fail = (errStr) => {
			reject(getError(errStr))
		}
		const success = (info) => {
			// 用户状态正常的话，在此登录成功并生成token
			if (info.status === 0) {
				/**
				 * 1，登录时间
				 * 2，应用代码
				 * 3，环境代码
				 * 4，用户id
				 * 5，项目代码。以及项目前缀，用-隔开
				 * 6，甲方代码
				 * 7，级别代码
				 * 8，权限代码。会有多项，是用|隔开的字符串
				 * 9，会员级别
				 * 10，设备id
				 * 11，当前的时间戳
				 */
				const arr = [
					common.startTime, // 1，登录时间
					Apply, // 2，应用代码
					Test, // 3，环境代码
					info._id, // 4，用户id
					`${Target}-${Prefix}`, // 5，项目代码
					Partya, // 6，甲方代码
					info.rank || '', // 7， 级别代码
					info.authority && info.authority.join('|') || '', // 8，权限代码
					Membership, // 9，会员级别
					Device, // 10，设备id
					common.startTime // 11，当前的时间戳
				]
				necessary.Token = request.token.get(arr)
				// 同时返回六个用户的特殊权限
				authority(info).then(auth => {
					info.auth = auth
					resolve(getResult({data: info, token: necessary.Token}))
				}).catch(err => {
					resolve(getResult({data: info, token: necessary.Token}))
				})
			} else {
				fail('用户状态异常')
			}
		}
		var {
			user_id,
			account, password, 
			passtype = request.basedata.PassType, // 注册时要有passtype。密码登录时一般也要有
			phone, uuid, code,
			openid, // 第三方授权，一定有该参数，可能有user_id(用于绑定)。第三番授权后要求要有电话号码才能真正登录
			addInfo, // 注册时，添加的额外信息。比如用户名name、账户名account、密码类型passtype、推荐人信息parent等
		} = data
		if (openid) {
			fail('暂不支持授权登录')
		} else {
			// 可能没有验证码和用户数据库
			var {userDb, testDb} = request.basedata[request.basedata.current]
			if (userDb) {
				var db = uniCloud.database()
				const dbCmd = db.command
				db = db.collection(`${userDb}${Test && testDb && testDb.includes(userDb) ? '-test' : ''}`)
				if (user_id) {
					db.doc(user_id).get().then(res => {
						if (res.data.length === 1) {
							if (res.data[0].phone_state === 9) {
								fail('用户已注销或不存在')
							} else {
								success(res.data[0])
							}
						} else {
							fail('用户id有误')
						}
					}).catch(reject)
				} else if (account && password) { // 账号登录。登录失败的时候，可以考虑传给前端改用户的加密方式，该方案并不科学，暂时不实现
					const {InitialPassword} = request.basedata
					if (password === InitialPassword ||  // 如果是初始密码，则删除密码
						password === synctool.secret.setPassword(InitialPassword, passtype)
					) {
						password = undefined
					}
					db.where({account, password, phone_state: dbCmd.neq(9)}).get().then(res => {
						if (res.data.length === 1 && res.data[0].password === password) { // 不可以设为初始密码
							success(res.data[0])
						} else {
							fail('账号或密码错误')
						}
					}).catch(reject)
				} else if (phone && (code && uuid || code === request.basedata.DefaultVerifyCode)) {
					/**
					 * 先验证再注册或登录
					 */
					verify.check({uuid, phone, code}).then(res => {
						db.where({phone}).get().then(res => {
							if (res.data.length === 0) {
								// 自动注册为新用户
								const addParams = {
									phone, target: Target, account: phone,
									status: 0, phone_state: 1, lang: 'zh_CN',
									...addInfo,
									timestamp: Date.now()
								}
								db.add(addParams).then(res => {
									addParams._id = res._id
									success(addParams)
								})
							} else {
								success(res.data[0])
								if (res.data.length > 1) {
									// 删除其余的用户，仅保留第一个
									delete res.data[0]
									const ids = []
									res.data.map(item => {
										ids.push(item._id)
									})
									db.where({_id: dbCmd.in(ids)}).remove().then(res => {
										console.log(`删除${ids.length}个用户`)
									})
								}
							}
						}).catch(reject)
					}).catch(reject)
				} else {
					fail('没有合法的登录参数')
				}
			} else {
				if (user_id === '18565720739' || (phone === '18565720739' && uuid === request.basedata.DefaultVerifyCode)) {
					success({
						"phone": "18565720739",
						"target": "product",
						"status": 0,
						"phone_state": 1,
						"lang": "zh_CN",
						"timestamp": 1732173921397,
						"_id": "18565720739"
					})
				} else {
					fail('没有合法的登录参数')
				}
			}
		}
	})
}